﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace FeizNavegueitor
{
    public partial class FrmPrincipal : Form
    {
        private Queue<string> _usuarios;
        private string _urlUnica;
        private bool _procesoUnicoFinalizado;

        public FrmPrincipal()
        {
            InitializeComponent();
            _urlUnica = null;
        }

        public FrmPrincipal(string url)
        {
            InitializeComponent();
            _urlUnica = url;
        }

        private void FrmPrincipal_Load(object sender, EventArgs e)
        {
            if (_urlUnica != null)
            {
                _usuarios = new Queue<string>();
                _usuarios.Enqueue(_urlUnica);
                bgwNavergueitor.RunWorkerAsync(elMaligno);
            }
        }

        private void btnLeerUsuarios_Click(object sender, EventArgs e)
        {
            _usuarios = new Queue<string>();

            using (StreamReader reader = new StreamReader("Cache.txt"))
                do
                {
                    _usuarios.Enqueue(reader.ReadLine());    
                } while (!reader.EndOfStream);
                

            lblCantidadUsuarios.Text = _usuarios.Count.ToString();
        }

        private double _procesados;

        private void tmrRevisador_Tick(object sender, EventArgs e)
        {
            if (_urlUnica == null)
            {
                if (lblCantidadUsuarios.Text == "0")
                    return;

                double pija = _procesados / double.Parse(lblCantidadUsuarios.Text);
                pbEstadoBloqueo.Value = (int)pija * 100;
                lblProcesados.Text = _procesados.ToString("N0");
            }
            else
            {
                if (_procesoUnicoFinalizado)
                    Close();
            }
        }

        #region Bloqueos

        private void btnBloquear_Click(object sender, EventArgs e)
        {
            _procesados = pbEstadoBloqueo.Value = 0;
            bgwNavergueitor.RunWorkerAsync(elMaligno);
        }

        private void bgwNavergueitor_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
        }

        private void bgwNavergueitor_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }

        private void bgwNavergueitor_DoWork(object sender, DoWorkEventArgs e)
        {
            WebBrowser malignus = e.Argument as WebBrowser;

            EmpezarBloqueo(malignus);
        }

        private WebBrowser _malignusSegundaDimension;

        private void EmpezarBloqueo(WebBrowser malignus)
        {
            if (_usuarios.Count == 0)
                return;

            string usuario = _usuarios.Dequeue();
            using (StreamWriter writer = new StreamWriter("AnteUltimo.txt", false))
                writer.WriteLine(usuario);

            malignus.Navigate(usuario);
        }

        private void elMaligno_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            _malignusSegundaDimension = sender as WebBrowser;
            Timer tmrEsperar = new Timer();
            tmrEsperar.Interval = 2000;
            tmrEsperar.Tick += tmEsperarNavergador_Tick;
            tmrEsperar.Start();
        }

        private void tmEsperarNavergador_Tick(object sender, EventArgs e)
        {
            Timer tmrEsperar = sender as Timer;
            tmrEsperar.Stop();
            PrepararBloqueo();
        }

        private void PrepararBloqueo()
        {
            HtmlElementCollection todosLosDivs = _malignusSegundaDimension.Document.Body.GetElementsByTagName("div");
            foreach (HtmlElement item in todosLosDivs)
                if (item.GetAttribute("className").Contains("uiPopover"))
                {
                    HtmlElement boton = item.FirstChild;
                    if (boton == null || boton.TagName.ToLower() != "button" || !boton.GetAttribute("value").Equals("1"))
                        continue;

                    boton.InvokeMember("click");
                    break;
                }

            HtmlElementCollection todosLosLinks = _malignusSegundaDimension.Document.Body.GetElementsByTagName("a");
            foreach (HtmlElement item in todosLosLinks)
                if (item.GetAttribute("href").ToLower().Contains("ajax/privacy/block_user"))
                {
                    item.InvokeMember("click");
                }

            Timer tmrBloquear = new Timer();
            tmrBloquear.Interval = 2000;
            tmrBloquear.Tick += new EventHandler(tmrBloquear_Tick);
            tmrBloquear.Start();
        }

        private void tmrBloquear_Tick(object sender, EventArgs e)
        {
            Timer tmrBloquear = sender as Timer;
            tmrBloquear.Stop();

            HtmlElementCollection todosLosBotones = _malignusSegundaDimension.Document.Body.GetElementsByTagName("button");
            foreach (HtmlElement item in todosLosBotones)
                if (item.GetAttribute("className").Contains("layerConfirm uiOverlayButton"))
                    item.InvokeMember("click");

            Timer tmrFinalizar = new Timer();
            tmrFinalizar.Interval = 2000;
            tmrFinalizar.Tick += new EventHandler(tmrFinalizar_Tick);
            tmrFinalizar.Start();
        }

        private void tmrFinalizar_Tick(object sender, EventArgs e)
        {
            Timer tmrFinalizar = sender as Timer;
            tmrFinalizar.Stop();
            _procesados++;

            if (_urlUnica == null)
                EmpezarBloqueo(_malignusSegundaDimension);
            else
                _procesoUnicoFinalizado = true;
        }

        #endregion
    }
}
